package com.ck.retry.service.impl;

import com.ck.retry.service.RetryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;

import java.time.LocalTime;

/**
 * @author ck
 * @date 2024/1/8 9:37
 */


/**
 * @Retryable ：注解方式标记当前方法会使用重试机制
 *  value ：重试的触发机制，当遇到Exception异常的时候，触发；
 *  maxAttempts ：重试的次数（包括第一次调用，也就是说如果设置3次，调用一次后，如果一直失败触发重试，那么还当前方法还会调用2次）；
 *  delay ：重试的延迟时间，也就是距离上一次重试方法调用的间隔，单位毫秒
 *  multiplier ：delay间隔时间的倍数，也就是说，第一次重试间隔如果是2000ms，那第二次重试的时候就是2000ms 乘以这个倍数1.5，就是3000ms；
 *  maxDelay :重试次数之间的最大时间间隔,默认为0,即忽略,如果小于delay的设置,则默认为30000L；
 */
@Service
@Slf4j
public class RetryServiceImpl implements RetryService {
    @Override
    @Retryable(value = Exception.class,maxAttempts = 3,backoff = @Backoff(delay = 2000,multiplier = 1.5))
    public int retryTest(int code) throws Exception {
      log.info("retryTest被调用，时间"+ LocalTime.now());
        if (code==0){
            //模拟网络波动
            throw new Exception("网络波动，调用错误");
        }
        return 200;
    }

    @Recover
    public int recover(Exception e){
        log.info("重试次数用完执行回调方法");
        //这里可以记录日志到数据库  或 调用其他方法
        return 400;
    }
}
